package com.hanoi.wiki.manager.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.hanoi.wiki.dao.CategoryDAO;
import com.hanoi.wiki.dao.CategoryTypeDAO;
import com.hanoi.wiki.dao.PlacesDAO;
import com.hanoi.wiki.dao.PlacesInQueuedDAO;
import com.hanoi.wiki.exception.DataAccessException;
import com.hanoi.wiki.manager.CategoryManager;
import com.hanoi.wiki.model.Category;
import com.hanoi.wiki.model.CategoryType;
import com.hanoi.wiki.model.Places;
import com.hanoi.wiki.model.PlacesInQueued;
import com.hanoi.wiki.model.json.CategoryJson;

@Component
@Transactional
public class CategoryManagerImpl extends BaseManagerImpl implements CategoryManager{

	@Autowired
	private CategoryDAO categoryDAO;
	
	@Autowired
	private PlacesDAO placesDAO;
	
	@Autowired
	private PlacesInQueuedDAO inQueuedDAO;
	
	@Autowired
	private CategoryTypeDAO typeDAO;
	
	public int save(CategoryJson json) {
		try {
			Category category = new Category(json);
			
			List<CategoryType> categoryTypes = new ArrayList<CategoryType>();
			CategoryType categoryType;
			for(Integer i : json.getCategoryTypes()) {
				categoryType = typeDAO.get(i);
				if (categoryType != null) {
					categoryTypes.add(categoryType);
				}
			}
			
			List<Places> places = new ArrayList<Places>();
			Places place;
			for(Integer i : json.getPlaces()) {
				place = placesDAO.get(i);
				if(place != null) {
					places.add(place);
				}
			}
			
			
			List<PlacesInQueued> placesInQueueds = new ArrayList<PlacesInQueued>();
			PlacesInQueued inQueued;
			for(Integer i : json.getPlacesInQueueds()) {
				inQueued = inQueuedDAO.get(i);
				if (inQueued != null) {
					placesInQueueds.add(inQueued);
				}
			}
			
			category.setCategoryTypes(categoryTypes);
			category.setPlaces(places);
			category.setPlacesInQueueds(placesInQueueds);
			
			return categoryDAO.saveCategory(category);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return 0;
	}

	
	public void update(CategoryJson json) {
		try {
			Category category = new Category(json);
			
			List<CategoryType> categoryTypes = new ArrayList<CategoryType>();
			CategoryType categoryType;
			for(Integer i : json.getCategoryTypes()) {
				categoryType = typeDAO.get(i);
				if (categoryType != null) {
					categoryTypes.add(categoryType);
				}
			}
			
			List<Places> places = new ArrayList<Places>();
			Places place;
			for(Integer i : json.getPlaces()) {
				place = placesDAO.get(i);
				if(place != null) {
					places.add(place);
				}
			}
			
			
			List<PlacesInQueued> placesInQueueds = new ArrayList<PlacesInQueued>();
			PlacesInQueued inQueued;
			for(Integer i : json.getPlacesInQueueds()) {
				inQueued = inQueuedDAO.get(i);
				if (inQueued != null) {
					placesInQueueds.add(inQueued);
				}
			}
			
			category.setCategoryTypes(categoryTypes);
			category.setPlaces(places);
			category.setPlacesInQueueds(placesInQueueds);
			category.setId(json.getId());
			
			categoryDAO.update(category);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	
	public CategoryJson get(Integer id) {
		try {
			return new CategoryJson(categoryDAO.get(id));
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

	
	public List<CategoryJson> getList() {
		List<CategoryJson> categoryJsonList = new ArrayList<CategoryJson>();
		List<Category> categoryList = categoryDAO.getList();
		try {
			for (Category category : categoryList) {
				categoryJsonList.add(new CategoryJson(category));
			}
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return categoryJsonList;		
	}

	
	public void remove(Integer id) {
		try {
			if(categoryDAO.get(id) != null) {
				categoryDAO.remove(id);
			}
		} catch (DataAccessException e) {
			e.printStackTrace();
		}		
	}

}
